import ApiClient from '@/api/apiClient';

import type { RequestBody } from 'alova';

/**
 * SysAccessProtocol对象，节点类型和传输协议映射表
 */
export interface SysAccessProtocol {
  /**
   * 协议code
   */
  accessProtocolCode?: string;
  /**
   * 协议名称
   */
  accessProtocolName?: string;
  /**
   * 创建人
   */
  createBy?: string;
  /**
   * 创建人id
   */
  createId?: number;
  /**
   * 创建时间
   */
  createTime?: string;
  /**
   * 主键
   */
  id?: number;
  /**
   * 是否逻辑删除，0否,其他是
   */
  isDelete?: number;
  /**
   * 节点类型 1:直连设备 2:网关设备 3:网关子设备
   */
  nodeType?: number;
  /**
   * 修改人
   */
  updateBy?: string;
  /**
   * 修改人id
   */
  updateId?: number;
  /**
   * 更新时间
   */
  updateTime?: string;
  /**
   * 乐观锁版本号
   */
  version?: number;
  [property: string]: unknown;
}

/**
 * 服务实例对象
 */
export interface AccessProtocol {
  /**
   * 业务唯一code
   */
  code?: string;
  /**
   * 创建时间
   */
  createTime?: string;
  /**
   * 当前接入的设备数
   */
  deviceCount?: number;
  id?: number;
  /**
   * 服务实例key 创建实例自动生成
   */
  keyInfo?: string;
  /**
   * mqtt认证clientId
   */
  mqttClientId?: string;
  /**
   * mqtt认证username
   */
  mqttUserName?: string;
  /**
   * 实例名称
   */
  name?: string;
  /**
   * 关联的产品code
   */
  productCode?: string;
  /**
   * 关联的产品名称
   */
  productName?: string;
  /**
   * 实例描述
   */
  remark?: string;
  /**
   * 0:离线 1:在线
   */
  status?: number;
  [property: string]: any;
}

/** 获取接入协议列表 */
export const equipmentAccessProtocolListApi = (data: RequestBody) => {
  return ApiClient.Post<API.ListType<AccessProtocol[]>>('/manager/server/page', data, {
    meta: { auth: true },
  });
};

/** 保存更新接入协议 */
export const equipmentAccessProtocolSaveOrUpdateApi = (data: RequestBody) => {
  return ApiClient.Post<AccessProtocol>('/manager/server/save', data, {
    meta: { auth: true },
  });
};

/** 删除接入协议 */
export const equipmentAccessProtocolDeleteApi = (data: Merged<RequestBody, { id: number }>) => {
  return ApiClient.Post<AccessProtocol>(`/manager/server/del/${data.id}`, data, {
    meta: { auth: true },
  });
};

/** 根据节点类型获取协议列表 */
export const equipmentAccessProtocolListByNodeTypeApi = (
  data: Merged<RequestBody, { nodeType: number }>
) => {
  return ApiClient.Get<SysAccessProtocol[]>(
    `/manager/accessProtocol/getByNodeType/${data.nodeType}`,
    {
      meta: { auth: true },
    }
  );
};
